//
//  Problem406.swift
//  TestProject
//
//  Created by 武侠 on 2021/5/21.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 406. 根据身高重建队列
 假设有打乱顺序的一群人站成一个队列，数组 people 表示队列中一些人的属性（不一定按顺序）。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ，前面 正好 有 ki 个身高大于或等于 hi 的人。

 请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ，其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性（queue[0] 是排在队列前面的人）。

 示例 1：
     输入：people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
     输出：[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
     解释：
     编号为 0 的人身高为 5 ，没有身高更高或者相同的人排在他前面。
     编号为 1 的人身高为 7 ，没有身高更高或者相同的人排在他前面。
     编号为 2 的人身高为 5 ，有 2 个身高更高或者相同的人排在他前面，即编号为 0 和 1 的人。
     编号为 3 的人身高为 6 ，有 1 个身高更高或者相同的人排在他前面，即编号为 1 的人。
     编号为 4 的人身高为 4 ，有 4 个身高更高或者相同的人排在他前面，即编号为 0、1、2、3 的人。
     编号为 5 的人身高为 7 ，有 1 个身高更高或者相同的人排在他前面，即编号为 1 的人。
     因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。
 示例 2：
     输入：people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
     输出：[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]
 提示：
     1 <= people.length <= 2000
     0 <= hi <= 106
     0 <= ki < people.length
 题目数据确保队列可以被重建
 */
@objcMembers class Problem406: NSObject {
    func solution() {
        print(reconstructQueue([[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]))
    }
    
    /*
     [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
     规律：我们知道 ki 相同时，他们是按照hi排序的，例如：[4,0], [5,0] .. [6,0]，所以我们先按照 ki 排序一遍, ki相同时，按照hi排序
     1: 先按照ki排序数组sortList -> [[5,0],[7,0],[6,1],[7,1],[5,2],[4,4],]
     2: 我们创建一个空数组list，遍历sortList，
        2.1 如果list.len < sortList[i][1]：说明此时的sortList[i]放到最后就行了，因为数组的长度 满足不了我
        2.2 如果list.len >= sortList[i][1]: 说明此时我肯定放到数组的中间某一个位置，但是我知道在哪，那么我就放到刚刚满足我需求的位置，例如：我要求前面有2个人，那么我就放到数组的list[2]的位置即可
     */
    func reconstructQueue(_ people: [[Int]]) -> [[Int]] {
        let sortList = people.sorted { first, second in
            if first[0] == second[0] {
                return first[1] < second[1]
            } else {
                return first[0] > second[0]
            }
        }
        print(sortList)
        var result:[[Int]] = []
        for pl in sortList {
            if result.count <= pl[1] {
                result.append(pl)
            } else {
                result.insert(pl, at: pl[1])
            }
        }
        return result
    }
}
